Viac SQL prikazov naraz
Otázka od: Ludo Fulop
9. 11. 2002 19:15
zdravim, ako do ADOQuery.SQL vlozit viac SQL prikazov?
skusal som dat do kazdeho riadku jeden, oddelovat medzerou, bodkociarkou,
ale nic nefungovalo
dik
Ludo Fulop
Odpovedá: Jan Sebelík
10. 11. 2002 12:06
> Odesílatel: Ludo Fulop <kexo@ynet.sk>
> zdravim, ako do ADOQuery.SQL vlozit viac SQL prikazov?
> skusal som dat do kazdeho riadku jeden, oddelovat medzerou, bodkociarkou,
> ale nic nefungovalo
Vsechny komponenty tohoto typu (TQuery, TADOQuery, TADODataSet, TIBQuery,
TIBDataSet, TSQLQuery, TSQLDataSet) jsou konstruovany pro jeden prikaz.
Pokud chces vice prikazu, musis si to nejak zprogramovat sam - nic tezkeho:
procedure ExecSQLScript(SQL:TStrings)
a tady z SQL.Text vyseparujes jednotlive prikazy treba tak, ze najdes priskusny
separator, treba ";", jednotlivy prikaz nacpes do ADOQuery.SQL a provedes
ADOQuery.ExecSQL.
Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================
Odpovedá: Blazek Jaroslav
10. 11. 2002 16:52
Ahoj,
> honza@haes.cz 10.11.02 11:44 >>>
> Odesílatel: Ludo Fulop <kexo@ynet.sk>
> zdravim, ako do ADOQuery.SQL vlozit viac SQL prikazov?
> skusal som dat do kazdeho riadku jeden, oddelovat medzerou, bodkociarkou,
> ale nic nefungovalo
>Vsechny komponenty tohoto typu (TQuery, TADOQuery, TADODataSet, TIBQuery,
TIBDataSet, TSQLQuery, TSQLDataSet) jsou konstruovany pro jeden prikaz.
tak to neni pravda
ja bezne pouzivam ADOQuery nad MSSQL, kde mam vice selectu, insertu nebo
update....jen se musi spravne skombinovat
ty co vraci DataSet musi byt jen s temi co vraci DataSet a naopak
a je to daleko rychlejsi, kdyz to poslu vsechno naraz nez to delat v nejakem
cyklu
takze v klidu muzu pouzit
ADOQuery.Close();
ADOQuery.SQL.Clear();
ADOQuery.SQL.Add('SELECT * FROM Tabulka1');
ADOQuery.SQL.Add('SELECT * FROM Tabulka2');
ADOQuery.SQL.Add('SELECT * FROM Tabulka3');
ADOQuery.Open();
prvni SELECT mas normalne v DataSource.DataSet a ostatni dostanes pomoci metody
NextRecordset()
nebo treba
ADOQuery.Close();
ADOQuery.SQL.Clear();
ADOQuery.SQL.Add(Format('INSERT INTO Tabulka1 (Col1, Col2) VALUES %d, ''%s'')',
[10, 'Nejaky text']));
ADOQuery.SQL.Add(Format('UPDATE Tabulka2 SET Col1 = %d WHERE IdTabulka2 = %d',
[10000, 123]));
ADOQuery.ExecSQL();
S pozdravem
Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644
Odpovedá: Lstiburek Pavel
11. 11. 2002 10:11
Pozor,
TADO..., nevykonna "jeden prikaz po druhem", ale vytvori si docasnou
ulozenou proceduru a tu spusti (podobne to funguje kdyz tam das parametry),
coz zejmena pri vytvareni objektu muze celkem dost zmenit vysledek.
Pribyde totiz jeste jedna vrstva tzv. implicitnich transakci a nektere
objekty ji nemusi prezit.
Pavel
From: Blazek Jaroslav [mailto:Jaroslav.Blazek@access-it.cz]
> honza@haes.cz 10.11.02 11:44 >>>
> Odesílatel: Ludo Fulop <kexo@ynet.sk>
> zdravim, ako do ADOQuery.SQL vlozit viac SQL prikazov?
> skusal som dat do kazdeho riadku jeden, oddelovat medzerou, bodkociarkou,
> ale nic nefungovalo
>Vsechny komponenty tohoto typu (TQuery, TADOQuery, TADODataSet, TIBQuery,
TIBDataSet, TSQLQuery, TSQLDataSet) jsou konstruovany pro jeden prikaz.
tak to neni pravda
ja bezne pouzivam ADOQuery nad MSSQL, kde mam vice selectu, insertu nebo
update....jen se musi spravne skombinovat
ty co vraci DataSet musi byt jen s temi co vraci DataSet a naopak
a je to daleko rychlejsi, kdyz to poslu vsechno naraz nez to delat v nejakem
cyklu
takze v klidu muzu pouzit
ADOQuery.Close();
ADOQuery.SQL.Clear();
ADOQuery.SQL.Add('SELECT * FROM Tabulka1');
ADOQuery.SQL.Add('SELECT * FROM Tabulka2');
ADOQuery.SQL.Add('SELECT * FROM Tabulka3');
ADOQuery.Open();
prvni SELECT mas normalne v DataSource.DataSet a ostatni dostanes pomoci
metody NextRecordset()
nebo treba
ADOQuery.Close();
ADOQuery.SQL.Clear();
ADOQuery.SQL.Add(Format('INSERT INTO Tabulka1 (Col1, Col2) VALUES %d,
''%s'')',
[10, 'Nejaky text']));
ADOQuery.SQL.Add(Format('UPDATE Tabulka2 SET Col1 = %d WHERE IdTabulka2 =
%d',
[10000, 123]));
ADOQuery.ExecSQL();
Odpovedá: Jan Sebelík
11. 11. 2002 15:47
> > honza@haes.cz 10.11.02 11:44 >>>
> >Vsechny komponenty tohoto typu (TQuery, TADOQuery, TADODataSet, TIBQuery,
TIBDataSet, TSQLQuery, TSQLDataSet) jsou konstruovany pro jeden prikaz.
> Odesílatel: Blazek Jaroslav <Jaroslav.Blazek@access-it.cz>
> tak to neni pravda
> ja bezne pouzivam ADOQuery nad MSSQL, kde mam vice selectu, insertu nebo
update....jen se musi spravne skombinovat
> prvni SELECT mas normalne v DataSource.DataSet a ostatni dostanes pomoci
metody NextRecordset()
No, diky za informaci, to jsem opravdu nevedel.
Jenom tedy fakt nevím, co bych pripojil na ten DataSource, pokud se mi bude
DataSet pod nim menit.
Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================
Odpovedá: Blazek Jaroslav
11. 11. 2002 17:16
Ahoj,
> honza@haes.cz 11.11.02 14:50 >>>
>No, diky za informaci, to jsem opravdu nevedel.
>Jenom tedy fakt nevím, co bych pripojil na ten DataSource, pokud se mi bude
DataSet pod nim menit.
prvni SELECT - Dataset (klasika DataSource.DataSet) se nemeni
jediny co se mi zdalo trochu neohrabany, je prave ziskani dalsich Datasetu
pomoci NextRecordset()
tak jsem si to trochu upravil
private
FOList:TObjectList;
function FGetRecordSets(AIndex:integer):TADOQuery;
function FGetRecordSetsCount:integer;
public
property RecordSets[Index:integer]:TADOQuery read FGetRecordSets;
property RecordSetsCount:integer read FGetRecordSetsCount;
function TMyADOQuery.FGetRecordSets(AIndex:integer):TADOQuery;
begin
Result := nil;
if (AIndex < 0) or (AIndex >= FOList.Count) then
exit;
Result := TMyADOQuery(FOList.Items[AIndex]);
end;
function TMyADOQuery.FGetRecordSetsCount:integer;
begin
Result := FOList.Count;
end;
procedure TMyADOQuery.Open();
var TmpRecordSet:_Recordset;
Rows:integer;
begin
inherited;
TmpRecordSet := NextRecordset(Rows);
while Assigned(TmpRecordSet) do
begin
FOList.Add(TADOQuery.Create(self));
TADOQuery(FOList.Items[FOList.Count - 1]).Connection := Connection;
TADOQuery(FOList.Items[FOList.Count - 1]).Recordset := TmpRecordSet;
TADOQuery(FOList.Items[FOList.Count - 1]).First();
TmpRecordSet := NextRecordset(Rows);
end;
end;
a potom uz jen staci na nejake tlacitko na formulari prirazovat nejakemu
DataSource, ktery je napichlej treba na DBGrid
vyuziti je spousta...
const Index:integer = -1;
begin
if MyADOQuery.RecordSetsCount > 0 then
begin
Inc(Index);
if Index = MyADOQuery.RecordSetsCount then
Index := 0;
DataSource1.DataSet := MyADOQuery.RecordSets[Index];
end
else
DataSource1.DataSet := nil;
end;
S pozdravem
Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644